package com.the_ring.chapter14;

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.media.browse.MediaBrowser;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;


import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.source.MergingMediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
import com.google.android.exoplayer2.upstream.DefaultDataSource;
import com.google.android.exoplayer2.util.MimeTypes;
import com.the_ring.chapter14.bean.MediaInfo;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    int RECORDER_CODE = 0;
    public void startAudio() {
        // 打开系统自带的录音机
        Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
        startActivityForResult(intent, RECORDER_CODE);
    }

    int THUMBNAIL_CODE = 1;
    public void startCamera() {
        // 下面通过系统相机拍照只能获得缩略图
        Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(photoIntent, THUMBNAIL_CODE);
    }


    private Uri mImageUri;  // 图片的路径对象
    int ORIGINAL_CODE = 2;
    private void startSystemCamera() {
        Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Android 10 开始必须由系统自动分配路径，同时该方式也能自动刷新相册
        ContentValues values = new ContentValues();
        // 指定图片的文件的名称
        values.put(MediaStore.Video.Media.DISPLAY_NAME, "photo_" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        values.put(MediaStore.Video.Media.MIME_TYPE, "image/jpeg");
        // 通过内容解析器插入一条外部内容的路径信息
        mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        // 下面通过系统相机拍照可以获得原始图
        photoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
        startActivityForResult(photoIntent, ORIGINAL_CODE);
    }

    Uri audioUri;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == RECORDER_CODE) {
            audioUri = data.getData();  // 录制好的音频的 Uri
        } else if (resultCode == RESULT_OK && requestCode == THUMBNAIL_CODE) {
            // 获得缩略图
            Bundle extras = data.getExtras();
            Bitmap bitmap = (Bitmap) extras.get("data");
        } else if (resultCode == RESULT_OK && requestCode == ORIGINAL_CODE) {
            // 获得原始图
            // 根据指定图片的 Uri，获得自动缩小后的位图对象
            //Bitmap bitmap = BitmapUtil.getAutoZoomImage(this, mImageUri);
        }
    }

    // 播放录音文件
    public void playAudio() {
        // 打开系统自带的收音机
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(audioUri, "audio/*");
        startActivity(intent);
    }


    // 音频列表
    private List<MediaInfo> audioList = new ArrayList<>();
    // 音频库 Uri
    private Uri mAudioUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    private String[] mAudioColumn = new String[] {  // 媒体库的字段名称数组
            MediaStore.Audio.Media._ID,             // 编号
            MediaStore.Audio.Media.TITLE,           // 标题
            MediaStore.Audio.Media.DURATION,        // 播放时长
            MediaStore.Audio.Media.SIZE,            // 文件大小
            MediaStore.Audio.Media.DATA };          // 文件路径
    private MediaPlayer mMediaPlayer = new MediaPlayer();       // 媒体播放器

    // 加载音频列表
    private void loadAudioList() {
        audioList.clear();      // 清空音频列表
        // 通过内容解析器查询音频库，并返回结果集的游标，记录结果按照修改时间降序返回
        Cursor cursor = getContentResolver().query(mAudioUri, mAudioColumn, null, null, "data_modified desc");
        if (cursor != null) {
            for (int i = 0; i < 10 && cursor.moveToNext(); i++) {
                MediaInfo audio = new MediaInfo();
                audio.setId(cursor.getLong(0));
                audio.setTitle(cursor.getString(1));
                audio.setDuration(cursor.getInt(2));
                audio.setSize(cursor.getLong(3));
                audio.setPath(cursor.getString(4));
                audioList.add(audio);
            }
            cursor.close();
        }
    }


    // 录制音频
    public void recorderAudio() {
        MediaRecorder recorder = new MediaRecorder();
        recorder.reset();   // 重置媒体录制器
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频源为麦克风
        recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);    // 设置媒体的输出格式
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);    // 设置媒体的音频编码器
        recorder.setMaxDuration(60 * 1000); // 设置媒体的最大录制时长
        recorder.setOutputFile("./data/recorder.amr");  // 设置媒体文件的保存路径
        try {
            recorder.prepare(); // 媒体录制器准备就绪
            recorder.start();   // 媒体录制器开始录制
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


//    int RECORDER_CODE = 0;
    public void startRadio() {
        // 下面准备跳转到系统摄像机，并获得录制完的视频文件
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        // 视频质量。0 为低质量；1 为高质量
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
        // 大小限制，单位为字节
        intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 10485760L);
        // 时长限制，单位为秒
        intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
        startActivityForResult(intent, RECORDER_CODE);
    }

    private ExoPlayer player;

    /**
     * 播放视频
     * @param videoUri
     */
    private void playVideo(Uri videoUri) {
        // 创建 HTTP 的在线视频工厂对象
        DefaultDataSource.Factory factory = new DefaultDataSource.Factory(this);
        // 创建指定地址的媒体对象
        MediaItem videoItem = new MediaItem.Builder().setUri(videoUri).build();
        // 基于工厂对象和媒体对象创建媒体来源
        ProgressiveMediaSource videoSource = new ProgressiveMediaSource.Factory(factory).createMediaSource(videoItem);
        player.setMediaSource(videoSource);   // 设置播放器的媒体来源
        // 给播放器添加事件监听器
        player.addListener(new Player.Listener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == Player.STATE_BUFFERING) {
                } else if (playbackState == Player.STATE_READY) {
                } else if (playbackState == Player.STATE_ENDED) {
                }
            }
        });
        player.prepare();
        player.play();
    }

    /**
     * 播放带字幕的视频
     * @param videoUri
     * @param subtileUri
     */
    private void playVideoWithSubtitle(Uri videoUri, Uri subtileUri) {
        // 创建 HTTP 的在线视频工厂对象
        DefaultDataSource.Factory factory = new DefaultDataSource.Factory(this);
        // 创建指定地址的媒体对象
        MediaItem videoItem = new MediaItem.Builder().setUri(videoUri).build();
        // 基于工厂对象和媒体对象创建媒体来源
        ProgressiveMediaSource videoSource = new ProgressiveMediaSource.Factory(factory).createMediaSource(videoItem);
        // 创建指定地址的字幕对象，ExoPlayer 只支持 srt 字幕，不支持 ass 字幕
        MediaItem.Subtitle subtitleItem = new MediaItem.Subtitle(subtileUri, MimeTypes.APPLICATION_SUBRIP, null, Format.NO_VALUE);
        // 基于工厂对象和字幕对象创建字幕来源
        SingleSampleMediaSource subtitleSource = new SingleSampleMediaSource.Factory(factory).createMediaSource(subtitleItem, C.TIME_UNSET);
        // 合并媒体来源与字幕来源
        MergingMediaSource mergingSource = new MergingMediaSource(videoSource, subtitleSource);
        player.setMediaSource(mergingSource);   // 设置播放器的媒体来源
        player.prepare();
        player.play();
    }
}